package br.edu.ifrn.annotation.manager;

import java.util.ArrayList;
import java.util.List;

import br.edu.ifrn.annotation.OrdenacaoPadrao;
import br.edu.ifrn.annotation.TipoOrdem;

public class GerenciadorOrdenacaoPadrao {
	
	/**
     * Recupera uma lista com as ordenações da entidade no formato "CAMPO ASC" ou "CAMPO DESC"
     * 
     * @param objetoAnotado
     * @return
     */
	@SuppressWarnings("unchecked")
	public static List<String> getOrdenacoes(Class classeAnotada) {
		String aliasEntidade = classeAnotada.getSimpleName().substring(0, 1).toLowerCase()
		+ classeAnotada.getSimpleName().substring(1);
		List<String> ordenacoes = new ArrayList<String>();
		try {
			if (classeAnotada.isAnnotationPresent(OrdenacaoPadrao.class)){
				String[] camposAnotados = Class.forName(classeAnotada.getCanonicalName()).getAnnotation(OrdenacaoPadrao.class).campos();
				TipoOrdem[] ordensAnotadas = Class.forName(classeAnotada.getCanonicalName()).getAnnotation(OrdenacaoPadrao.class).ordens();
				int camposAnotatosQtd = camposAnotados.length;
				
				for (int i=0; i < camposAnotatosQtd; i++) {
					String ordem = (ordensAnotadas.length > i ? ordensAnotadas[i].toString() : TipoOrdem.ASC.toString());
					ordenacoes.add(aliasEntidade+"."+camposAnotados[i]+" "+ordem);
				}
			}
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return ordenacoes;		
	}
	
	/**
     * Recupera a ordenação da entidade formatada no formato "CAMPO ASC, CAMPO DESC"
     * 
     * @param objetoAnotado
     * @return
     */
	@SuppressWarnings("unchecked")
	public static String getOrdenacaoFormatada(Class classeAnotada){
		List<String> ordenacoes = GerenciadorOrdenacaoPadrao.getOrdenacoes(classeAnotada);
		if (!ordenacoes.isEmpty()) {
			StringBuilder ordem = new StringBuilder();
			for (String string : ordenacoes) {
				ordem.append(string+", ");	
			}
			int tamanhoTemporario = ordem.length();
			return ordem.delete(tamanhoTemporario-2, tamanhoTemporario).toString();
		}else{
			return "";
		}
	}
}
